/*
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

package com.facebook.common.media;

import java.util.Locale;
import java.util.Map;

import android.support.annotation.Nullable;
import android.webkit.MimeTypeMap;

import com.facebook.common.internal.ImmutableMap;

/**
 * Utility class.
 */
public class MediaUtils {
	// Additional mime types that we know to be a particular media type but
	// which may not be
	// supported natively on the device.
	public static final Map<String, String> ADDITIONAL_ALLOWED_MIME_TYPES = ImmutableMap.of("mkv", "video/x-matroska");

	public static boolean isPhoto(@Nullable String mimeType) {
		return mimeType != null && mimeType.startsWith("image/");
	}

	public static boolean isVideo(@Nullable String mimeType) {
		return mimeType != null && mimeType.startsWith("video/");
	}

	public @Nullable
	static String extractMime(String path) {
		String extension = extractExtension(path);
		if (extension == null) {
			return null;
		}
		extension = extension.toLowerCase(Locale.US);
		String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);

		// If we did not find a mime type for the extension specified, check our
		// additional
		// extension/mime-type mappings.
		if (mimeType == null) {
			mimeType = ADDITIONAL_ALLOWED_MIME_TYPES.get(extension);
		}
		return mimeType;
	}

	private @Nullable
	static String extractExtension(String path) {
		int pos = path.lastIndexOf('.');
		if (pos < 0 || pos == path.length() - 1) {
			return null;
		}
		return path.substring(pos + 1);
	}

	/**
	 * @return true if the mime type is one of our whitelisted mimetypes that we
	 *         support beyond what the native platform supports.
	 */
	public static boolean isNonNativeSupportedMimeType(String mimeType) {
		return ADDITIONAL_ALLOWED_MIME_TYPES.containsValue(mimeType);
	}
}
